#ifndef H_BIGINTEGER
#define H_BIGINTEGER

struct BigInteger
{
public:
	BigInteger();
	BigInteger(char* value);
	BigInteger(int value);
	BigInteger(BigInteger const& value);
	~BigInteger();
	void swap(BigInteger & b);	
	BigInteger& operator = (BigInteger const& b);

	friend bool operator ==(BigInteger const& a, BigInteger const& b);
	friend bool operator !=(BigInteger const& a, BigInteger const& b);
	friend bool operator >(BigInteger const& a, BigInteger const& b);
	friend bool operator <(BigInteger const& a, BigInteger const& b);
	friend bool operator >=(BigInteger const& a, BigInteger const& b);
	friend bool operator <=(BigInteger const& a, BigInteger const& b);

	friend BigInteger operator + (BigInteger const& a, BigInteger const& b);
	friend BigInteger operator - (BigInteger const& a, BigInteger const& b);		
	friend BigInteger operator * (BigInteger const& a, BigInteger const& b);
	friend BigInteger operator - (BigInteger const& a);

	operator char*();  //без знака!!!

	int getSign() const;	//1 или -1	

private:
	char* data;
	int length;
	bool isPositive;	

	//умножить на 10, т.е. сдвинуть влево	
	void rollLeft(int n);
	
	//умножить на 1 цифру
	void multiplyOneDigit(int b);

	//получить цифру
	int getDigit(int pos) const;
	//1 - текущее больше, 0 - равны, -1 - меньше
	bool compareAbs(BigInteger const& b) const;
	
	//сложение модулей чисел
	void plusAbs(BigInteger const& b);

	//вычитание модулей чисел
	//текущее больше чем вычитаемое	
	void minusAbs(BigInteger const& b);
};

#endif
